package controllers

import (
	"net/http"
	"time"

	"bankend/config"
	"bankend/database"
	"bankend/models"

	"github.com/gin-gonic/gin"
	"github.com/golang-jwt/jwt/v5"
)

// 自定义 JWT Claims
type Claims struct {
	Username string `json:"username"`
	jwt.RegisteredClaims
}

// Login 用户登录
// POST /api/login
func Login(c *gin.Context) {
	var input struct {
		Username string `json:"username"`
		Password string `json:"password"`
	}
	if err := c.ShouldBindJSON(&input); err != nil {
		c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
		return
	}

	var user models.User
	// 根据用户名查找未软删除的用户记录
	if err := database.DB.Where("username = ? AND deleted_at IS NULL", input.Username).First(&user).Error; err != nil {
		c.JSON(http.StatusUnauthorized, gin.H{"error": "用户名或密码错误"})
		return
	}

	// 此处应使用加密方式比对密码，示例中直接对比明文密码
	if user.Password != input.Password {
		c.JSON(http.StatusUnauthorized, gin.H{"error": "用户名或密码错误"})
		return
	}

	// 设置过期时间为12小时
	expirationTime := time.Now().Add(12 * time.Hour)

	// 创建 JWT Claims
	claims := &Claims{
		Username: user.Username,
		RegisteredClaims: jwt.RegisteredClaims{
			ExpiresAt: jwt.NewNumericDate(expirationTime),
			IssuedAt:  jwt.NewNumericDate(time.Now()),
			NotBefore: jwt.NewNumericDate(time.Now()),
		},
	}

	// 生成 token - 直接从配置获取密钥
	jwtKey := []byte(config.AppConfig.JWTSecret)
	token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims)
	tokenString, err := token.SignedString(jwtKey)
	if err != nil {
		c.JSON(http.StatusInternalServerError, gin.H{"error": "无法生成token"})
		return
	}

	// 登录成功，返回用户信息和 token
	c.JSON(http.StatusOK, gin.H{
		"message": "登录成功",
		"user":    user,
		"token":   tokenString,
	})
}

// Register 用户注册
// POST /api/register
func Register(c *gin.Context) {
	var input models.User
	if err := c.ShouldBindJSON(&input); err != nil {
		c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
		return
	}

	// 检查用户名是否已存在（也可扩展校验邮箱等信息）
	var count int64
	database.DB.Model(&models.User{}).Where("username = ?", input.Username).Count(&count)
	if count > 0 {
		c.JSON(http.StatusBadRequest, gin.H{"error": "用户名已存在"})
		return
	}

	// 开启事务
	tx := database.DB.Begin()

	// 设置创建和更新时间
	now := time.Now()
	input.CreateTime = now
	input.UpdateTime = now

	// 在事务中创建用户
	if err := tx.Create(&input).Error; err != nil {
		tx.Rollback()
		c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()})
		return
	}

	// 创建用户订阅设置
	userSubscribe := models.UserSubscribe{
		UserID:          input.ID,
		SubscribeWeb:    false,
		SubscribeWechat: false,
	}

	if err := tx.Create(&userSubscribe).Error; err != nil {
		tx.Rollback()
		c.JSON(http.StatusInternalServerError, gin.H{"error": "创建用户订阅设置失败"})
		return
	}

	// 提交事务
	if err := tx.Commit().Error; err != nil {
		tx.Rollback()
		c.JSON(http.StatusInternalServerError, gin.H{"error": "提交事务失败"})
		return
	}

	c.JSON(http.StatusCreated, gin.H{"user": input})
}